/***************************************************************************
 *   mgpi_thrlib.h - Multi-Threading Library Declarations                  *
 *   Copyright (C) 2008 by cmaster.matso                                   *
 *   cmaster.matso@gmail.com                                               *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#ifndef _THRLIB_H
#define _THRLIB_H

#ifdef __cplusplus
extern "C" {
#endif

#include "../../grbclr/src/mgpi_grbclr.h"

#define MGPI_MAX_ASYNC_CALLS    128                                             /** max number of asynchronous calls */

#pragma pack(push,1)
    
    typedef struct {
        int hight, offset;
        SDL_Thread *thread;
        void *vparam;
    } thrctrl_t;                                                                /** thread controler */

#pragma pack(pop)

    /**
     * Adds a thread to thread tree.
     */
    int MGPI_API MGPI_AddThread(tree_t **tree, int (*thrp)(void *), void *vparam);

    /**
     * Returns number of threads in the thread tree.
     */
    int MGPI_API MGPI_GetThreadsNumber(void);

    /**
     * Deletes threads form the thread tree.
     */
    int MGPI_API MGPI_DeleteThreads(tree_t *tree);

    /**
     * Gets a thread of the given ID form the thread tree.
     */
    SDL_Thread MGPI_API *MGPI_GetThread(tree_t *tree, int thr);

    /**
     * An asynchronous call.
     */
    void MGPI_API MGPI_AsyncCall(int (*asyncCall)(void *), void *ptr);

    /**
     * Synchronizes asynchronous calls.
     */
    void MGPI_API MGPI_SynchCalls(int *status[MGPI_MAX_ASYNC_CALLS]);

#ifdef __cplusplus
}
#endif

#endif
